using System;
using System.Collections.Generic;
using System.Text;
using COSXML.CosException;
using COSXML.Common;

namespace COSXML.Utils
{
    public sealed class StringUtils
    {
        public static int Compare(string strA, string strB, bool ignoreCase)
        {

            if (strA == null || strB == null)
            {
                throw new CosClientException((int)CosClientError.InvalidArgument, "strA = null or strA = null");
            }

            if (ignoreCase)
            {
                strA = strA.ToLower();
                strB = strB.ToLower();
            }

            int strALen = strA.Length;
            int strBLen = strB.Length;


            for (int i = 0, size = strALen > strBLen ? strBLen : strALen; i < size; i++)
            {
                int temp1 = (int)strA[i];
                int temp2 = (int)strB[i];

                if (temp1 > temp2)
                {

                    return 1;
                }
                else
if (temp1 < temp2)
                {

                    return -1;
                }

            }

            if (strALen > strBLen)
            {

                return 1;
            }

            if (strALen < strBLen)
            {

                return -1;
            }

            return 0;
        }


        public static string MergePath(string path)
        {
            string[] names = path.Split('/');
            IList<string> stack = new List<string>();
            foreach (string name in names) {
                if ("..".Equals(name)) {
                    if (stack.Count > 0) {
                        stack.RemoveAt(stack.Count - 1);
                    }
                } else if (name.Length > 0 && !".".Equals(name)) {
                    stack.Add(name);
                }
            }
            StringBuilder ans = new StringBuilder();
            if (stack.Count == 0) {
                ans.Append('/');
            } else {
                foreach (string name in stack) {
                    ans.Append('/');
                    ans.Append(name);
                }
            }
            return ans.ToString();
        }
        
        // public static Dictionary<string, string> ParseURL(string url)
        // {
        //     Dictionary<string, string> urlTuple = new Dictionary<string, string>();

        //     if (String.IsNullOrEmpty(url))
        //     {

        //         return null;
        //     }

        //     int index = url.IndexOf("://");

        //     if (index > 0)
        //     {
        //         urlTuple.Add("Scheme", url.Substring(0, index));
        //     }
        //     else
        //     {
        //         throw new ArgumentException("url need start with http:// or https://");
        //     }

        //     int tmp = index;

        //     index = url.IndexOf('/', tmp + 3);

        //     if (index > 0)
        //     {
        //         urlTuple.Add("Host", url.Substring(tmp + 3, index - tmp - 3));
        //         tmp = index;
        //     }
        //     else
        //     {
        //         urlTuple.Add("Host", url.Substring(tmp + 3));

        //         return urlTuple;
        //     }

        //     index = url.IndexOf('?', tmp);

        //     if (index > 0)
        //     {
        //         urlTuple.Add("Path", url.Substring(tmp, index - tmp));
        //         tmp = index;
        //     }
        //     else
        //     {
        //         urlTuple.Add("Path", url.Substring(tmp));

        //         return urlTuple;
        //     }

        //     index = url.IndexOf("#", tmp + 1);

        //     if (index > 0)
        //     {
        //         urlTuple.Add("Query", url.Substring(tmp + 1, index - tmp - 1));
        //         tmp = index;
        //     }
        //     else
        //     {
        //         urlTuple.Add("Query", url.Substring(tmp + 1));

        //         return urlTuple;
        //     }

        //     urlTuple.Add("Fragment", url.Substring(tmp + 1));

        //     return urlTuple;
        // }
    }
}
